package com.example.myapplication.api;

import com.example.myapplication.model.LightStatusResponse;
import com.example.myapplication.model.LoginRequest;
import com.example.myapplication.model.LoginResponse;
import com.example.myapplication.model.RpcRequest;
import com.example.myapplication.model.RpcResponse;
import com.example.myapplication.model.TelemetryData;
import com.example.myapplication.model.TelemetryResponse;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * API服务接口定义
 */
public interface ApiService {
    
    /**
     * 用户登录接口
     * @param loginRequest 登录请求参数
     * @return 登录响应结果
     */
    @POST("api/auth/login")
    Call<LoginResponse> login(@Body LoginRequest loginRequest);

    /**
     * 获取设备遥测数据接口
     * @param authorization 认证头 (Bearer token)
     * @param entityType 实体类型 (DEVICE)
     * @param entityId 设备ID
     * @param useStrictDataTypes 是否使用严格数据类型
     * @return 遥测数据响应
     */
    @GET("api/plugins/telemetry/{entityType}/{entityId}/values/timeseries")
    Call<TelemetryResponse> getTelemetryData(
            @Header("X-Authorization") String authorization,
            @Path("entityType") String entityType,
            @Path("entityId") String entityId,
            @Query("useStrictDataTypes") boolean useStrictDataTypes
    );

    /**
     * 获取光照传感器数据接口
     * @param authorization 认证头 (Bearer token)
     * @param entityType 实体类型 (DEVICE)
     * @param entityId 光照传感器设备ID
     * @param useStrictDataTypes 是否使用严格数据类型
     * @return 光照传感器数据响应
     */
    @GET("api/plugins/telemetry/{entityType}/{entityId}/values/timeseries")
    Call<TelemetryResponse> getLightSensorData(
            @Header("X-Authorization") String authorization,
            @Path("entityType") String entityType,
            @Path("entityId") String entityId,
            @Query("useStrictDataTypes") boolean useStrictDataTypes
    );

    /**
     * 获取湿度传感器数据接口
     * @param authorization 认证头 (Bearer token)
     * @param entityType 实体类型 (DEVICE)
     * @param entityId 湿度传感器设备ID
     * @param useStrictDataTypes 是否使用严格数据类型
     * @return 湿度传感器数据响应
     */
    @GET("api/plugins/telemetry/{entityType}/{entityId}/values/timeseries")
    Call<TelemetryResponse> getHumiditySensorData(
            @Header("X-Authorization") String authorization,
            @Path("entityType") String entityType,
            @Path("entityId") String entityId,
            @Query("useStrictDataTypes") boolean useStrictDataTypes
    );

    /**
     * 获取人体红外传感器数据接口
     * @param authorization 认证头 (Bearer token)
     * @param entityType 实体类型 (DEVICE)
     * @param entityId 人体红外传感器设备ID
     * @param useStrictDataTypes 是否使用严格数据类型
     * @return 人体红外传感器数据响应
     */
    @GET("api/plugins/telemetry/{entityType}/{entityId}/values/timeseries")
    Call<TelemetryResponse> getHumanDetectionSensorData(
            @Header("X-Authorization") String authorization,
            @Path("entityType") String entityType,
            @Path("entityId") String entityId,
            @Query("useStrictDataTypes") boolean useStrictDataTypes
    );

    /**
     * 设备RPC控制接口
     * @param authorization 认证头 (Bearer token)
     * @param deviceId 设备ID
     * @param rpcRequest RPC请求参数
     * @return RPC响应结果
     */
    @POST("api/rpc/oneway/{deviceId}")
    Call<RpcResponse> sendRpcCommand(
            @Header("X-Authorization") String authorization,
            @Path("deviceId") String deviceId,
            @Body RpcRequest rpcRequest
    );

    /**
     * 获取灯光状态数据接口
     * @param authorization 认证头 (Bearer token)
     * @param entityType 实体类型 (DEVICE)
     * @param entityId 设备ID
     * @param useStrictDataTypes 是否使用严格数据类型
     * @return 灯光状态响应
     */
    @GET("api/plugins/telemetry/{entityType}/{entityId}/values/timeseries")
    Call<LightStatusResponse> getLightStatus(
            @Header("X-Authorization") String authorization,
            @Path("entityType") String entityType,
            @Path("entityId") String entityId,
            @Query("useStrictDataTypes") boolean useStrictDataTypes
    );

    /**
     * 上报遥测数据接口
     * @param accessToken 访问令牌
     * @param telemetryData 遥测数据
     * @return 响应结果
     */
    @POST("api/v1/{accessToken}/telemetry")
    Call<Void> sendTelemetryData(
            @Path("accessToken") String accessToken,
            @Body TelemetryData telemetryData
    );

    /**
     * 获取加湿器状态数据接口
     * @param authorization 认证头 (Bearer token)
     * @param entityType 实体类型 (DEVICE)
     * @param entityId 设备ID
     * @param useStrictDataTypes 是否使用严格数据类型
     * @return 加湿器状态响应
     */
    @GET("api/plugins/telemetry/{entityType}/{entityId}/values/timeseries")
    Call<LightStatusResponse> getHumidifierStatus(
            @Header("X-Authorization") String authorization,
            @Path("entityType") String entityType,
            @Path("entityId") String entityId,
            @Query("useStrictDataTypes") boolean useStrictDataTypes
    );

    /**
     * 上报加湿器遥测数据接口
     * @param accessToken 访问令牌
     * @param telemetryData 遥测数据
     * @return 响应结果
     */
    @POST("api/v1/{accessToken}/telemetry")
    Call<Void> sendHumidifierTelemetryData(
            @Path("accessToken") String accessToken,
            @Body TelemetryData telemetryData
    );

    /**
     * 获取报警器状态数据接口
     * @param authorization 认证头 (Bearer token)
     * @param entityType 实体类型 (DEVICE)
     * @param entityId 设备ID
     * @param useStrictDataTypes 是否使用严格数据类型
     * @return 报警器状态响应
     */
    @GET("api/plugins/telemetry/{entityType}/{entityId}/values/timeseries")
    Call<LightStatusResponse> getAlarmStatus(
            @Header("X-Authorization") String authorization,
            @Path("entityType") String entityType,
            @Path("entityId") String entityId,
            @Query("useStrictDataTypes") boolean useStrictDataTypes
    );

    /**
     * 上报报警器遥测数据接口
     * @param accessToken 访问令牌
     * @param telemetryData 遥测数据
     * @return 响应结果
     */
    @POST("api/v1/{accessToken}/telemetry")
    Call<Void> sendAlarmTelemetryData(
            @Path("accessToken") String accessToken,
            @Body TelemetryData telemetryData
    );

    /**
     * 获取风扇状态数据接口
     * @param authorization 认证头 (Bearer token)
     * @param entityType 实体类型 (DEVICE)
     * @param entityId 设备ID
     * @param useStrictDataTypes 是否使用严格数据类型
     * @return 风扇状态响应
     */
    @GET("api/plugins/telemetry/{entityType}/{entityId}/values/timeseries")
    Call<LightStatusResponse> getFanStatus(
            @Header("X-Authorization") String authorization,
            @Path("entityType") String entityType,
            @Path("entityId") String entityId,
            @Query("useStrictDataTypes") boolean useStrictDataTypes
    );

    /**
     * 上报风扇遥测数据接口
     * @param accessToken 访问令牌
     * @param telemetryData 遥测数据
     * @return 响应结果
     */
    @POST("api/v1/{accessToken}/telemetry")
    Call<Void> sendFanTelemetryData(
            @Path("accessToken") String accessToken,
            @Body TelemetryData telemetryData
    );
}
